# -*- coding: utf-8 -*-
import pytest
import logging
import datetime
# 对于给定的测试用例(item)和调用步骤(call)，返回一个测试报告对象(_pytest.runner.TestReport)
# 装饰的钩子函数，有以下两个作用：
#（1）可以获取到测试用例不同执行阶段的结果（setup，call，teardown）
#（2）可以获取钩子方法的调用结果（yield返回一个result对象）和调用结果的测试报告（返回一个report对象）


@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    # 通过 out = yield 定义了一个生成器。在生成器中，res = out.get_result() 获取了测试结果对象。
    out = yield     # 类似return，但是它返回之后执行完毕会自动回来
    res = out.get_result()
    # res.when == "call"：表示正在运行调用测试函数的阶段。
    if res.when == "call":
        logging.info(f"用例ID：{res.nodeid}")
        logging.info(f"测试结果：{res.outcome}")
        logging.info(f"故障表示：{res.longrepr}")
        logging.info(f"异常：{call.excinfo}")
        logging.info(f"用例耗时：{res.duration}")
        logging.info("**************************************")



import allure
import jsonpath
import json
from extend.keywords import KeyWords



key_words = KeyWords()
# 就是一个普通的方法，这个特殊点，在测试之前或之后做一些事情
# TODO 全局登录获取Token,不需要人工进行调佣，Pytest会自己去进行调用
# @pytest.fixture(scope="session")
# def get_token_by_login():
#     host = 'http://shop-xo.hctestedu.com'
#     with allure.step("第一步:登录获取Token，接口：api/user/login"):
#         # 登录接口
#         pub_pararms = {
#             "application": "app",
#             "application_client_type": "pc",
#             "s": "api/user/login"
#         }
#
#         data_body = {
#             "accounts": "felix_test",
#             "pwd": "11081103",
#             "type": "username"
#         }
#
#         header = {
#             "Content-Type": "Application/json"
#         }
#         data_body_link = 'accounts=felix_test&pwd=11081103&type=username'
#
#         re = key_words.request_post(url=host, headers=header, params=pub_pararms, data=json.dumps(data_body))
#
#         res = re.json()
#         print(re)
#         print(re.url)
#         print(re.request.url)
#         print("请求头:", re.request.headers)
#         print("响应头:", re.headers)
#         print(re.request.body)
#         print(res["msg"])
#
#         # TODO 获取响应数据msg
#
#         msg = jsonpath.jsonpath(re.json(), "$..msg")[0]
#         token = jsonpath.jsonpath(re.json(), "$..token")[0]
#
#         print("获取到的数据:", msg)
#         print("获取到的token:", token)
#
#         # TODO 通过对应的msg进行断言处理
#         assert "登录成功" == msg, f"不成功显示：期望结果:登录成功，实际结果:{msg}"
#
#         return token
